package com.zhilei;

import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;

import static com.rabbitmq.client.BuiltinExchangeType.FANOUT;

/**
 * @author 志磊
 */
public class RabbitProducer {

    public static void main(String[] args) throws Exception {

        // 创建工厂连接方式
        ConnectionFactory factory = new ConnectionFactory();

        // 定义 RabbitMQ 连接的 IP 及端口
        factory.setHost("localhost");
        factory.setPort(5672);
        factory.setVirtualHost("/");
        factory.setUsername("zhilei");
        factory.setPassword("zhilei");

        // 创建一个新的连接
        Connection connection = factory.newConnection();

        // 创建一个新的频道
        Channel channel = connection.createChannel();

        // 创建交换机
        // String var1 交换机的名称, BuiltinExchangeType var2 交换机的类型, boolean var3, boolean var4, boolean var5, Map<String, Object> var
        // DIRECT("direct"),  ：定向投递模式，将消息发送给指定的 路由key
        // FANOUT("fanout"),  : 广播模式，发布订阅，将消息发布给指定
        // TOPIC("topic"),    ：通配符模式，将消息发送给指定的 路由key
        // HEADERS("headers");：使用率不高，参数匹配
        // durable； 是否持久化
        // autoDelete； 是否自动删除
        // internal ：  是否内部的，内部的消息只能rabbitMQ内部进行调用，自定义的消费者不能进行消费
        // arguments：  参数
        // fanoutExchange ： 自定义的交换机
        String fanoutExchange = "fanout_exchange";
        channel.exchangeDeclare(fanoutExchange, FANOUT, true, false, false, null);

        // 声明两个队列，声明时可以设定持久化属性，durable=true表示队列持久化
        String fanoutQueueA = "fanout_exchange_a";
        String fanoutQueueB = "fanout_exchange_b";
        channel.queueDeclare(fanoutQueueA, true, false, false, null);
        channel.queueDeclare(fanoutQueueB, true, false, false, null);

        // 绑定交换机和队列
        channel.queueBind(fanoutQueueA, fanoutExchange, "");
        channel.queueBind(fanoutQueueB, fanoutExchange, "");

        for (int i = 0; i < 10; i++) {
            String message = "上班了，开始进行搬砖! " + i;
            // 发布消息到交换机，routingKey可以为空
            channel.basicPublish(fanoutExchange, "", null, message.getBytes());
            System.out.println(" [x] Sent '" + message + "'");
        }

        // 关闭频道和连接
        channel.close();
        connection.close();
    }
}
